package com.paydemo.pay.RabbitMQ;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 死信队列消费者
 */
@Slf4j
@Component
public class DeadLetterConsumer {

    /**
     * 处理订单创建死信消息
     */
    @RabbitListener(queues = MqConstants.DEAD_LETTER_ORDER_CREATE_QUEUE)
    public void handleOrderCreateDeadLetter(Message message) {
        try {
            // 获取消息内容
            String messageBody = new String(message.getBody());
            log.error("接收到订单创建死信消息: {}", messageBody);
            
            // 获取原始的路由键
            String originalRoutingKey = message.getMessageProperties().getReceivedRoutingKey();
            log.error("原始路由键: {}", originalRoutingKey);
            
            // 获取消息属性
            String messageId = message.getMessageProperties().getMessageId();
            log.error("消息ID: {}", messageId);
            
            // 获取异常信息
            Object exception = message.getMessageProperties().getHeaders().get("x-exception-message");
            log.error("异常信息: {}", exception);
            
            // 这里可以进行告警、记录日志、人工干预等操作
            // 例如：发送邮件通知、短信通知、钉钉通知等
            
            // 也可以尝试重新处理消息，或者将消息保存到数据库中，等待后续处理
            
            log.info("订单创建死信消息处理完成");
        } catch (Exception e) {
            log.error("处理订单创建死信消息异常", e);
        }
    }
    
    /**
     * 处理支付成功死信消息
     */
    @RabbitListener(queues = MqConstants.DEAD_LETTER_SUCCESS_QUEUE)
    public void handlePaymentSuccessDeadLetter(Message message) {
        try {
            // 获取消息内容
            String messageBody = new String(message.getBody());
            log.error("接收到支付成功死信消息: {}", messageBody);
            
            // 解析消息内容
            PaymentMessage paymentMessage = JSON.parseObject(messageBody, PaymentMessage.class);
            log.error("订单号: {}, 金额: {}", paymentMessage.getOrderNo(), paymentMessage.getAmount());
            
            // 这里可以进行告警、记录日志、人工干预等操作
            
            log.info("支付成功死信消息处理完成");
        } catch (Exception e) {
            log.error("处理支付成功死信消息异常", e);
        }
    }
    
    /**
     * 处理支付失败死信消息
     */
    @RabbitListener(queues = MqConstants.DEAD_LETTER_FAIL_QUEUE)
    public void handlePaymentFailDeadLetter(Message message) {
        try {
            // 获取消息内容
            String messageBody = new String(message.getBody());
            log.error("接收到支付失败死信消息: {}", messageBody);
            
            // 解析消息内容
            PaymentMessage paymentMessage = JSON.parseObject(messageBody, PaymentMessage.class);
            log.error("订单号: {}, 金额: {}", paymentMessage.getOrderNo(), paymentMessage.getAmount());
            
            // 这里可以进行告警、记录日志、人工干预等操作
            
            log.info("支付失败死信消息处理完成");
        } catch (Exception e) {
            log.error("处理支付失败死信消息异常", e);
        }
    }
    
    /**
     * 处理支付超时死信消息
     */
    @RabbitListener(queues = MqConstants.DEAD_LETTER_TIMEOUT_QUEUE)
    public void handlePaymentTimeoutDeadLetter(Message message) {
        try {
            // 获取消息内容
            String messageBody = new String(message.getBody());
            log.error("接收到支付超时死信消息: {}", messageBody);
            
            // 解析消息内容
            PaymentMessage paymentMessage = JSON.parseObject(messageBody, PaymentMessage.class);
            log.error("订单号: {}, 金额: {}", paymentMessage.getOrderNo(), paymentMessage.getAmount());
            
            // 这里可以进行告警、记录日志、人工干预等操作
            
            log.info("支付超时死信消息处理完成");
        } catch (Exception e) {
            log.error("处理支付超时死信消息异常", e);
        }
    }
} 